//package cn.zyq.nutlet.system.aspect;
//
//import cn.zyq.nutlet.beans.blog.Blog;
//import cn.zyq.nutlet.beans.userMp.UserMp;
//import cn.zyq.nutlet.service.confine.ConfineLogService;
//import cn.zyq.nutlet.system.annotation.UserMpAccessRole;
//import cn.zyq.nutlet.system.enums.core.ResponseCodeEnum;
//import cn.zyq.nutlet.system.enums.userMp.UserMpAuthCodeTypeEnum;
//import cn.zyq.nutlet.system.exception.WebException;
//import com.alibaba.fastjson.JSON;
//import com.alibaba.fastjson.JSONObject;
//import org.aspectj.lang.ProceedingJoinPoint;
//import org.aspectj.lang.annotation.Around;
//import org.aspectj.lang.annotation.Aspect;
//import org.aspectj.lang.annotation.Pointcut;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Component;
//
//import java.lang.reflect.Method;
//import java.util.Date;
//
//@Aspect
//@Component
//public class UserMpAccessAspect {
//
//    @Autowired
//    private ConfineLogService confineLogService;
//
//    @Pointcut(value = "execution(public * cn.zyq.nutlet.service..*(..))")
//    public void controllerAspect() {
//    }
//
//    @Around(value = "controllerAspect()")
//    public Object around(ProceedingJoinPoint pjp) throws Throwable {
//        Method method = AspectUtil.getMethod(pjp);
//        if (method != null && method.isAnnotationPresent(UserMpAccessRole.class)) {
//            UserMpAccessRole userMpAccessRole = method.getAnnotation(UserMpAccessRole.class);
//            Object[] args = pjp.getArgs();
//            if (args.length > 1) {
//                Object arg = args[args.length - 1];
//                if (arg instanceof UserMp) {
//                    UserMp userMp = (UserMp) arg;
//                    Integer authCode = userMp.getAuthCode();
//                    Integer expectRoleType = userMpAccessRole.role().getValue();
//                    if (authCode >= expectRoleType) {
//                        JSONObject backInfo = new JSONObject();
//                        backInfo.put("time", userMp.getConfineEndTime());
//                        backInfo.put("reason", userMp.getConfineReason());
//                        ResponseCodeEnum code = userMpAccessRole.code();
//                        if (ResponseCodeEnum.PERMISSION_DENIED_ADD_BLOG.equals(code)) {
//                            try {
//                                Object arg0 = args[0];
//                                Blog blog = (Blog) arg0;
//                                if (blog.getRelevanceID() > 0) {
//                                    code = ResponseCodeEnum.PERMISSION_DENIED_SHARE;
//                                }
//                            } catch (Exception e) {
//                            }
//                        }
//                        throw new WebException(code, JSON.toJSONString(backInfo));
//                    }
//                    if (UserMpAuthCodeTypeEnum.SMALL_BLACK_HOUSE.getValue().equals(userMp.getAuthCode())) {
//                        // 用户正在小黑屋中
//                        long now = System.currentTimeMillis();
//                        Date endDate = userMp.getConfineEndTime();
//                        if (endDate != null) {
//                            long end = endDate.getTime();
//                            if (now >= end) {
//                                // 自动解禁
//                                this.confineLogService.remove(UserMpAuthCodeTypeEnum.SMALL_BLACK_HOUSE, userMp);
//                            }
//                        }
//                    } else if (UserMpAuthCodeTypeEnum.GRAY_HOUSE.getValue().equals(userMp.getAuthCode())) {
//                        // 用户正在灰名单中
//                        long now = System.currentTimeMillis();
//                        Date endDate = userMp.getConfineEndTime();
//                        if (endDate != null) {
//                            long end = endDate.getTime();
//                            if (now >= end) {
//                                // 自动解禁
//                                this.confineLogService.remove(UserMpAuthCodeTypeEnum.GRAY_HOUSE, userMp);
//                            }
//                        }
//                    }
//                }
//            }
//        }
//        Object result = pjp.proceed();
//        return result;
//    }
//
//}
